/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.fxbank.netbeans.plugins.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.xml.sax.SAXException;

/**
 *
 * @author alexey
 */
public class Utils {
    
    private static XMLProps XML = null;
    private static Map<String, String> XNG_FUNCTIONS = new HashMap<String, String>();
    private static String XNG_ROOT_FOLDER = File.separator.concat("web").concat(File.separator).concat("WEB-INF").
            concat(File.separator).concat("generic_settings").concat(File.separator).concat("cfg").
            concat(File.separator).concat("db").concat(File.separator).concat("queries").concat(File.separator);
    private static String FACTORY_ROOT_PATH = File.separator.concat("web").concat(File.separator).concat("WEB-INF").
            concat(File.separator).concat("conf").concat(File.separator).concat("factory.xml");
    
    public static String[] getXNGFiles(File filePath, String name){
        try {

            List<String> list = new ArrayList<String>();
            
            if (XML == null){
                //кешируем, чтобы каждый раз не читать
                XML = XMLProps.load(filePath);
            }
            
            List<XMLNode> list1 = XML.getXPathNodes("/factory/factories/*");
            for (XMLNode factoryName : list1) {
                List<XMLNode> queriesList = factoryName.getChilds();
                for (XMLNode queries : queriesList) {
                    List<XMLNode> queryList = queries.getChilds();
                    for (XMLNode query : queryList) {
                        if ("query".equalsIgnoreCase(query.getName()) && query.getAttr("name") != null &&
                                query.getAttr("name").equalsIgnoreCase(name)){
                            if (query.getText() != null) {
                                list.add(factoryName.getName()+"-"+query.getText()+".xng-"+getFunctionByXNG(getXNGFolderByFile(filePath), query.getText()));
                            }else{
                                System.out.println("text is null: "+factoryName+"="+query.getAttr("name"));
                            }
                            
                        }
                    }
                }
            }
            
            return list.toArray(new String[list.size()]);
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        } catch (ParserConfigurationException ex) {
            Exceptions.printStackTrace(ex);
        } catch (SAXException ex) {
            Exceptions.printStackTrace(ex);
        }
        
        return null;
    }
    
    /*
     * Возвращает имя в factory.xml, например:
     * call = getMethod("SOMETHING")
     * Вернет "SOMETHING"(без кавычек)
     */
    public static String getFactoryMethodName(String call){
        if (call != null && !call.isEmpty()){
            int methodIndex = call.indexOf("getMethod");
            if (methodIndex != -1){
                call = call.substring(methodIndex);
                int start = call.indexOf("\"");
                int end = call.indexOf("\"", start+1);
                if (end > start){
                    return call.substring(start+1, end);
                }
                
            }
        }
        return "";
    }
    
    public static String getFunctionByXNG(String XNGFolder, String xngName){
        System.out.println("file: "+XNGFolder+File.separator+xngName+".xng");
        String function = XNG_FUNCTIONS.get(xngName);
        if (function == null){
            BufferedReader br = null;
            try {
                //читаем файл и кешируем
                br = new BufferedReader(new FileReader(XNGFolder+File.separator+xngName+".xng"));
                String line = br.readLine();
                while(line != null){
                    if (line.toLowerCase().contains("frontend")){
                        function = line;
                        //кешируем!
                        XNG_FUNCTIONS.put(xngName, function);
                        break;
                    }
                    line = br.readLine();
                }
            } catch (FileNotFoundException ex) {
                function = String.format("File '%s' not found", xngName);
            } catch (Throwable ex) {
                Exceptions.printStackTrace(ex);
            } finally {
                if (br != null){
                    try {
                        br.close();
                    } catch (IOException ex) {
                        Exceptions.printStackTrace(ex);
                    }
                }
            }
        }else{
            System.out.println("taked from cache");
        }
        
        return function.trim();
    }
    
    /**
     * Возвращает путь до папки XNG-файлов, на вход принимает любой файл проекта
     * @return 
     */
    public static String getXNGFolderByFile(File projectFileObject) {
        Project project = FileOwnerQuery.getOwner(FileUtil.toFileObject(projectFileObject));
        return project.getProjectDirectory().getPath().concat(XNG_ROOT_FOLDER);
    }
    
    /**
     * Возвращает путь до папки XNG-файлов, на вход принимает любой файл проекта
     * @return 
     */
    public static String getXNGFolderByFile(String projectFileObject) {
        return getXNGFolderByFile(new File(projectFileObject));
    }
    
    /**
     * Возвращает путь до файла factory.xml, на вход принимает любой файл проекта
     * @return 
     */
    public static String getFactoryByFile(File projectFileObject) {
        Project project = FileOwnerQuery.getOwner(FileUtil.toFileObject(projectFileObject));
        return project.getProjectDirectory().getPath().concat(FACTORY_ROOT_PATH);
    }
    
    /**
     * Возвращает путь до файла factory.xml, на вход принимает любой файл проекта
     * @return 
     */
    public static String getFactoryByFile(String projectFileObject) {
        return getFactoryByFile(new File(projectFileObject));
    }
    
}
